"""  
多任务版本TCP服务器

1.循环接收客户端的链接
2.每接收到一个客户端就创建一个子线程，负责与该客户端通信
             a.给每一个客户端创建一个套接字
             b.给每一个客户端创建一个线程（守护线程）
             c.每个线程负责与该客户端通信
"""
#初始化TCP服务器
import socket
import threading
from utils import decode_data

def handle_client(client_socket:socket.socket,client_addr):
     threading_name = threading.current_thread().name
     hello_info = f"欢迎光临【苏子之家】服务器{threading_name}"
     client_socket.send(hello_info.encode())
     while True:
            #接收数据
            recv_data = client_socket.recv(_BUFFER)
            if recv_data: 
                msg = decode_data(recv_data)             
                print(f"接收客户端{client_addr}发来的的数据： {msg}")
                client_socket.send("收到 \n".encode())
            else:
                print(f"客户端{client_addr}已经断开链接")
                client_socket.close()
                break
                

_BUFFER = 2048
if __name__ == '__main__':
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    #设置端口复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
    #绑定ip和port
    #参数1 ip
    #参数2 port
    #ip 可以写空字符串，代表所有网卡都绑定
    tcp_server_socket.bind(("",8888))
    port = 8888
    #listen使套接字设置为被动模式
    #参数1 等待 链接的最大数量
    tcp_server_socket.listen(128)
    
    print("服务器启动成功，等待客户端的链接...",port)

    while True:
        client_socket,client_addr = tcp_server_socket.accept()
        
        print(f"已经与客户端{client_addr}建立链接")
        
        #此代码不要阻塞
        
        # handle_client(client_socket,client_addr)
        thread = threading.Thread(target=handle_client, args=(client_socket,client_addr),daemon=True)
        thread.start()
    tcp_server_socket.close()   